
import ilog.concert.IloException;
import ilog.concert.IloIntVar;
import ilog.concert.IloLinearNumExpr;
import ilog.cplex.IloCplex;

import my_cplex.my_cplex;
//写一个GMRA试试
public class cplex_3_GMRA {
    public static void main(String args[]) throws IloException {

        IloCplex model = new IloCplex();

        //初始化数据集
        my_cplex my_cplex = new my_cplex();

        int rows = 6;
        int cols = 6;

        //资格矩阵Q
        double[][] Q = my_cplex.create_dataset(rows,cols,true,1);

        //L向量，角色需求向量
        int[] L= {2,2,2,2,2,2};

        //La向量，代理能力向量
        int[] La = {3,3,4,2,4,3};

        //决策变量，T矩阵
        IloIntVar[][] T = new IloIntVar[rows][cols];
        for(int i=0;i<rows;i++){
            for(int j=0;j<cols;j++){
                T[i][j] = model.intVar(0,1,"T["+i+","+j+"]");
            }
        }

        //设置目标函数
        IloLinearNumExpr objExpr = model.linearNumExpr();
        for(int i=0;i<rows;i++){
            for(int j=0;j<cols;j++){
                objExpr.addTerm(T[i][j],Q[i][j]);
            }
        }
        model.addMaximize(objExpr);

        //定义约束条件
        //T[i,j]∈{0,1}已经隐含到决策变量中了

        //L[j]向量的限制
        for(int j=0;j<cols;j++){//列求和
            IloLinearNumExpr colSum = model.linearNumExpr();
            for(int i=0;i<rows;i++){
                //addTerm第一个是系数，第二个是数据项
                colSum.addTerm(1.0,T[i][j]);
            }
            //void addEq(IloNumExpr expr, double value, String name)，线性表达式，常数，约束的名称（可选）
            model.addEq(colSum,L[j]);
        }

        //La[i]向量的限制，如果是GRA就没有这一条限制
        for(int i=0;i<rows;i++){
            IloLinearNumExpr rowSum = model.linearNumExpr();
            for(int j=0;j<cols;j++){
                rowSum.addTerm(1.0,T[i][j]);
            }
            //不超过代理的能力
            model.addLe(rowSum,La[i]);
        }

        if(model.solve()){
            model.output().println("Solution status = " + model.getStatus());
            model.output().println("Solution value = " + model.getObjValue());
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    //System.out.println("x[" + i + "," + j + "]: " + model.getValue(x[i][j]));
                    double value = model.getValue(T[i][j])+0.0;
                    System.out.print(value+" ");
                }
                System.out.println();
            }
        }
    }
}
